//package cn.wiseda.finance.dao;
//
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import java.util.Arrays;
//import java.util.List;
//import java.util.Map;
//
//import javax.annotation.Resource;
//import javax.sql.DataSource;
//
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.jdbc.core.RowMapper;
//import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
//import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
//import org.springframework.stereotype.Component;
//import org.springframework.transaction.PlatformTransactionManager;
//import org.springframework.transaction.TransactionStatus;
//import org.springframework.transaction.support.TransactionCallback;
//import org.springframework.transaction.support.TransactionCallbackWithoutResult;
//import org.springframework.transaction.support.TransactionTemplate;
//import org.springside.examples.showcase.common.entity.User;
//import org.springside.modules.utils.VelocityUtils;
//
//import com.google.common.collect.Maps;
//
///**
// * User对象的Jdbc Dao, 演示Spring JdbcTemplate的使用.
// * 
// * @author calvin
// */
//@Component
//public class UserJdbcDao {
//
//	private static final String QUERY_USER_BY_ID = "select id, name, login_name from SS_USER where id=?";
//	private static final String QUERY_USER_BY_IDS = "select id, name, login_name from SS_USER where id in(:ids)";
//	private static final String QUERY_USER = "select id, name, login_name from SS_USER order by id";
//	private static final String QUERY_USER_BY_LOGINNAME = "select id,name,login_name from SS_USER where login_name=:login_name";
//	private static final String INSERT_USER = "insert into SS_USER(id, login_name, name) values(:id, :loginName, :name)";
//
//	private static Logger logger = LoggerFactory.getLogger(UserJdbcDao.class);
//
//	private SimpleJdbcTemplate jdbcTemplate;
//
//	private TransactionTemplate transactionTemplate;
//
//	private String searchUserSql;
//
//	private UserMapper userMapper = new UserMapper();
//
//	private class UserMapper implements RowMapper<User> {
//		public User mapRow(ResultSet rs, int rowNum) throws SQLException {
//			User user = new User();
//			user.setId(rs.getString("id"));
//			user.setName(rs.getString("name"));
//			user.setLoginName(rs.getString("login_name"));
//			return user;
//		}
//	}
//
//	@Resource
//	public void setDataSource(DataSource dataSource) {
//		jdbcTemplate = new SimpleJdbcTemplate(dataSource);
//	}
//
//	@Resource
//	public void setDefaultTransactionManager(PlatformTransactionManager defaultTransactionManager) {
//		transactionTemplate = new TransactionTemplate(defaultTransactionManager);
//	}
//
//	public void setSearchUserSql(String searchUserSql) {
//		this.searchUserSql = searchUserSql;
//	}
//
//	/**
//	 * 查询单个对象.
//	 */
//	public User queryObject(String id) {
//		return jdbcTemplate.queryForObject(QUERY_USER_BY_ID, userMapper, id);
//	}
//
//	/**
//	 * 查询对象列表.
//	 */
//	public List<User> queryObjectList() {
//		return jdbcTemplate.query(QUERY_USER, userMapper);
//	}
//
//	/**
//	 * 查询单个结果Map.
//	 */
//	public Map<String, Object> queryMap(Long id) {
//		return jdbcTemplate.queryForMap(QUERY_USER_BY_ID, id);
//	}
//
//	/**
//	 * 查询结果Map列表.
//	 */
//	public List<Map<String, Object>> queryMapList() {
//		return jdbcTemplate.queryForList(QUERY_USER);
//	}
//
//	/**
//	 * 使用Map形式的命名参数.
//	 */
//	public User queryByNamedParameter(String loginName) {
//		Map<String, Object> map = Maps.newHashMap();
//		map.put("login_name", loginName);
//
//		return jdbcTemplate.queryForObject(QUERY_USER_BY_LOGINNAME, userMapper, map);
//	}
//
//	/**
//	 * 使用Map形式的命名参数.
//	 */
//	public List<User> queryByNamedParameterWithInClause(Long... ids) {
//		Map<String, Object> map = Maps.newHashMap();
//		map.put("ids", Arrays.asList(ids));
//
//		return jdbcTemplate.query(QUERY_USER_BY_IDS, userMapper, map);
//	}
//
//	/**
//	 * 使用Bean形式的命名参数, Bean的属性名称应与命名参数一致. 
//	 */
//	public void createObject(User user) {
//		//使用BeanPropertySqlParameterSource将User的属性映射为命名参数.
//		BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(user);
//		jdbcTemplate.update(INSERT_USER, source);
//	}
//
//	/**
//	 * 批量创建/更新对象,使用Bean形式的命名参数.
//	 */
//	public void batchCreateObject(List<User> userList) {
//		int i = 0;
//		BeanPropertySqlParameterSource[] sourceArray = new BeanPropertySqlParameterSource[userList.size()];
//
//		for (User user : userList) {
//			sourceArray[i++] = new BeanPropertySqlParameterSource(user);
//		}
//
//		jdbcTemplate.batchUpdate(INSERT_USER, sourceArray);
//	}
//
//	/**
//	 * 使用freemarker创建动态SQL.
//	 */
//	public List<User> searchUserByFreemarkerSqlTemplate(Map<String, ?> conditions) {
//		String sql = VelocityUtils.render(searchUserSql, conditions);
//		logger.info(sql);
//		return jdbcTemplate.query(sql, userMapper, conditions);
//	}
//
//	/**
//	 * 使用TransactionTemplate编程控制事务,一般在Manager/Service层
//	 * 无返回值的情形.
//	 */
//	public void createUserInTransaction(User user) {
//
//		final BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(user);
//		transactionTemplate.execute(new TransactionCallbackWithoutResult() {
//			@Override
//			public void doInTransactionWithoutResult(TransactionStatus status) {
//				jdbcTemplate.update(INSERT_USER, source);
//			}
//		});
//	}
//
//	/**
//	 * 使用TransactionTemplate编程控制事务,一般在Manager/Service层
//	 * 有返回值的情形,并捕获异常进行处理不再抛出的情形.
//	 */
//	public boolean createUserInTransaction2(User user) {
//
//		final BeanPropertySqlParameterSource source = new BeanPropertySqlParameterSource(user);
//		return transactionTemplate.execute(new TransactionCallback<Boolean>() {
//			public Boolean doInTransaction(TransactionStatus status) {
//				try {
//					jdbcTemplate.update(INSERT_USER, source);
//					return true;
//				} catch (Exception e) {
//					logger.error(e.getMessage(), e);
//					status.setRollbackOnly();
//					return false;
//				}
//			}
//		});
//	}
//}
